#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//野指针成因：
//1、指针未初始化
//2、指针越界访问
//3、指针指向的空间释放
//指针指向的内存空间不属于当前程序，这个时候就是野指针。


//1、指针未初始化
//int main()
//{
//	int* p;//p是局部变量，没有初始化，那么p的值是随机值，访问位置不可知
//	*p = 10;//将随机内存地址的值进行修改，非法访问内存
//
//	return 0;
//}

//2、指针越界访问
//int main()
//{
//	int a[10] = { 0 };
//	int* p = a;
//	for (int i = 0; i < 20; i++)//指针范围超出数组范围时，p就是野指针
//	{
//		printf("%d\n", *p);//p指向不属于自己的空间，并访问。仅仅指向没关系，但访问就是非法的
//		p++;
//	}
//	return 0;
//}


//3、指针指向的空间释放
//int* test()
//{
//	int n = 100;//n是局部变量，函数执行完毕，n空间被释放
//	printf("%d\n", n);
//    return &n;
//}
//
//int main()
//{
//	int* p = test();//p得到地址的时候就是野指针了，因为p存放的地址指向的内存空间已经还给操作系统了。
//	printf("hehe\n");
//	printf("%d\n", *p);
//
//	return 0;
//}


//如何规避野指针
//1、指针初始化
//不知道指向哪里的时候，初始化为NULL
//NULL是C语言定义中的一个标识符常量，值为0,0也是地址，这个地址是无法使用的，读写该地址会报错。
//int main()
//{
//	int* p = NULL;//赋值为NULL是一种保护
//	//*p = 10;//非法访问，会报错
//	if (p != NULL)
//	{
//        *p = 10;
//	}
//
//
//	//int* q;//野指针
//	//*q = 10;
//
//	return 0;
//}

//2、小心指针越界

//3、指针变量不再使用时，及时置为NULL，指针使用之前检查有效性

